package com.ygqh.baby.service;

import com.ygqh.baby.ao.DataStatus;
import com.ygqh.baby.ao.PromotionType;
import com.ygqh.baby.ao.QueryInfo;
import com.ygqh.baby.ao.ResultSet;
import com.ygqh.baby.model.*;
import com.ygqh.baby.po.YgSku;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface YgSkuService {

    List<YgSku> find();

    List<YgSku> find(Long productId);

    int findCount();

    YgSku findById(Long id);

    List<YgSku> findByIds(Long[] ids);

    int deleteSoft(Long[] ids);

    int deleteSoft(Long id);

    int save(YgSku ygSku);

    int update(YgSku ygSku);

    int saveOrUpdate(YgSku ygSku);

    ResultSet<YgSku> search(QueryInfo queryInfo, String q);

    int saveBatch(List<YgSku> skus);

    Long[] findSkuIdsByGroupId(Long groupId);

    Long[] findSkuIdsWithBrandAndCategory(Long productId);

    Long[] findSkuIdsWithBrandOrCategory(Long productId);

    Boolean skuCodeExist(String skuCode, Long excludeId);

    int addSkuInBatch(List<YgSku> skuList);

    /**
     * 查询导入订单所需要的数据
     *
     * @param skuCode
     * @return
     */
    YgOrder4ImportModel findOrder4ImportModel(String skuCode);

    YgSku findBySkuCode(String skuCode, PromotionType type);

    void updateSalesPrice(Long productId, BigDecimal productSalePrice, BigDecimal vipPrice, BigDecimal promotionPrice, BigDecimal distributionPrice);

    List<YgSkuTemplate> findSkuTemplate();

    /**
     * 根据productId获取有库存的SKU列表
     *
     * @param productId
     * @param sizeName
     * @return
     */
    List<YgSku> selectWithStock(Long productId, String sizeName);

    List<Map<String, Object>> selectSkuCost(String productCode, String productName, String skuCode, Long groupId);

    int updateByProductId(YgSku ygSku);

    void updatePromotionPrice(BigDecimal promotionPrice, Long id, String updateBy, Date updateTime, BigDecimal vipRate, BigDecimal distributionPrice);

    String getSkuCodes(String productIds);

    /**
     * @param productCode
     * @param startDate
     * @param endDate
     * @param endDate
     * @param startDate
     * @return List<YgSkuReport> 返回类型
     * @throws @date 2017年9月5日 下午5:03:17
     * @Title: getSkuReport
     * @author （guohao）
     * @version V1.0
     */
    List<YgSkuReport> getSkuReport(String productCode, Date startDate, Date endDate);

    YgSkuInfo getSkuInfo(String skuCode, PromotionType pType);

    List<YgSkuInfo> getSkuInfoList(List<String> productIds);

    ResultSet<YgSkuInfo> search(QueryInfo queryInfo, String productName, String productCode, Long supplierId, Boolean hasSkuSupplierPrice);

    List<YgSkuInfo> getSkuInfoList(QueryInfo queryInfo, String productName, String productCode, Long supplierId, Boolean hasSkuSupplierPrice);

    YgSkuInfo findSkuInfoById(Long id);

    /**
     * 根据skuId集获取skuInfo
     *
     * @param list
     * @return
     */
    List<YgSkuInfo> findSkuInfoListByIds(List<Long> skuIdList);

    /**
     * 验证指定sku是否为团购商品
     *
     * @param skuInfos
     * @return
     */
    boolean checkSkuInfoIsGroup(String skuInfos);

    /**
     * 获取sku基础数据， 无需关心sku数据状态
     *
     * @param skuId skuid
     * @return SkuBasicData
     */
    SkuBasicData getBasicDataBySkuId(Long skuId);


    List<SkuBasicData> getBasicDataByBarCode(PromotionType pType, String... barCodes);

    /**
     * 获取sku基础数据， 需关心sku数据状态 有可能返回null值
     *
     * @param skuCode sku编码
     * @return SkuBasicData
     */
    SkuBasicData getBasicDataBySkuCode(String skuCode);

    /**
     * 根据产品编码获取最大的SKU编码
     *
     * @param productCode
     * @return
     */
    Long findMaxSkuCode(String productCode);

    List<SkuBasicData> getBasicDataBySkuCode(PromotionType pType, String... skuCodes);

    List<SkuBasicData> getBasicDataBySkuCode(PromotionType pType, DataStatus dataStatus, String... skuCodes);

    List<SkuBasicData> getBasicDataList(PromotionType pType, String productName);

    List<SkuMatchInfo> getSkuMatchInfoByProductIds(String[] productIds);

    boolean hasDiffPrice(Long productId);

    YgSkuInfo findSkuInfoBySkuCode(String skuCode, PromotionType pType);
}
